﻿using Server.Manager;
using Server.Struct;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Server.Message
{
    class Msg
    {
        private static readonly SyncPool<Msg> msgPool = new(() => { return new Msg(); });

        public static Msg GetMsg(MsgType type, object content)
        {
            if (msgPool.TryTake(out Msg msg))
            {
                msg.Clear();
                msg.type = type;
                msg.content = content;
                return msg;
            }
            throw new Exception("=========== Msg Take Fail!!!");
        }

        public static Msg GetRegMsg(MsgType type, Action<object> handler)
        {
            return GetMsg(MsgType.MsgReg, GetMsg(type, handler));
        }

        public static Msg GetUnregMsg(MsgType type, Action<object> handler)
        {
            return GetMsg(MsgType.MsgUnreg, GetMsg(type, handler));
        }

        public static void RecycleMsg(Msg msg)
        {
            if (msg == null)
                throw new Exception("=========== msg is null !!!!");
            msgPool.Recycle(msg);
        }

        public MsgType type;
        public object content;

        public void Clear()
        {
            type = MsgType.None;
            content = null;
        }
    }
}
